package cn.iocoder.yudao.module.vlog.info.service;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.vlog.info.bo.VLogMyActionBO;
import cn.iocoder.yudao.module.vlog.info.dal.dataobject.VLogInfoDO;
import cn.iocoder.yudao.module.vlog.info.vo.*;
import jakarta.validation.Valid;

import java.util.List;
import java.util.Set;

/**
 * 短视频 Service 实现类
 *
 * @author 山野羡民（1032694760@qq.com）
 */
public interface VLogInfoService {

    /**
     * 创建短视频
     *
     * @param shopId      店铺编号
     * @param userId      用户编号
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createInfo(Long shopId, Long userId, @Valid AppVLogInfoCreateReqVO createReqVO);

    /**
     * 更新视频信息
     *
     * @param updateReqVO 更新信息
     */
    void updateInfo(@Valid VLogInfoUpdateReqVO updateReqVO);

    /**
     * 更新视频状态
     *
     * @param updateReqVO 更新信息
     */
    void updateStatus(@Valid VLogInfoStatusUpdateReqVO updateReqVO);

    /**
     * 更新视频私密
     *
     * @param userId      用户编号
     * @param updateReqVO 更新信息
     */
    void updatePrivacy(Long userId, AppVLogInfoPrivacyUpdateReqVO updateReqVO);

    /**
     * 删除短视频
     *
     * @param id 编号
     */
    void deleteInfo(Long id);

    /**
     * 删除短视频
     *
     * @param userId 用户编号
     * @param id     编号
     */
    void deleteInfo(Long userId, Long id);

    /**
     * 校验短视频存在
     *
     * @param id 编号
     * @return 短视频
     */
    VLogInfoDO ensureInfoExists(Long id);

    /**
     * 获得短视频
     *
     * @param id 编号
     * @return 短视频
     */
    VLogInfoDO getInfo(Long id);

    /**
     * 获得短视频分页
     *
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getInfoPage(VLogInfoPageReqVO pageReqVO);

    /**
     * 获得可见的短视频分页
     *
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getEnabledInfoPage(AppVLogInfoPageReqVO pageReqVO);

    /**
     * 获得推荐的短视频分页
     *
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getRecommendInfoPage(AppLatLngPageReqVO pageReqVO);

    /**
     * 获得自己发布的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getMyInfoPage(Long userId, AppVLogInfoPageReqVO pageReqVO);

    /**
     * 获得自己点赞的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getLikedInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 获得自己收藏的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getFavoriteInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 获得自己关注的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getFollowInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 获得自己朋友的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getFriendInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 获得自己评论的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getCommentInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 获得自己看过的短视频分页
     *
     * @param userId    用户编号
     * @param pageReqVO 分页查询
     * @return 短视频分页
     */
    PageResult<VLogInfoDO> getBrowseHistoryInfoPage(Long userId, PageParam pageReqVO);

    /**
     * 检查自己是否已点赞、收藏、评论及关注
     *
     * @param userId 用户编号
     * @param ids    视频编号
     * @return 我的动作信息
     */
    List<VLogMyActionBO> checkMyActions(Long userId, List<Long> ids);


    // ==================== 子表（视频点赞、视频收藏） ====================

    /**
     * 视频点赞
     *
     * @param userId 用户编号
     * @param vlogId 视频编号
     */
    void likeVLog(Long userId, Long vlogId);

    /**
     * 视频取消点赞
     *
     * @param userId 用户编号
     * @param vlogId 视频编号
     */
    void unlikeVLog(Long userId, Long vlogId);

    /***
     * 获取视频点赞用户编号
     *
     * @param vlogId     视频编号
     */
    List<Long> getVLogLikedUserIds(Long vlogId);

    /**
     * 视频收藏
     *
     * @param userId 用户编号
     * @param vlogId 视频编号
     */
    void collectVLog(Long userId, Long vlogId);

    /**
     * 视频取消收藏
     *
     * @param userId 用户编号
     * @param vlogId 视频编号
     */
    void uncollectVLog(Long userId, Long vlogId);

    /***
     * 获取视频收藏用户编号
     *
     * @param vlogId     视频编号
     */
    List<Long> getVLogCollectUserIds(Long vlogId);


    /**
     * 获取视频信息数组
     *
     * @param vlogIds 视频编号数组
     */
    List<VLogInfoDO> getVLogInfoList(Set<Long> vlogIds);

}
